New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
bpo-17576: Strict __int__ and __index__ return types; operator.index always uses __index__ #13740
bpo-17576: Strict __int__ and __index__ return types; operator.index always uses __index__ #13740
Conversation
This PR should also allow simplifications to many parts of the codebase that currently need to check what type they got back from a |
@@ -367,11 +367,12 @@ def test_n(self): | |||
# (PY_SSIZE_T_MIN ... PY_SSIZE_T_MAX) | |||
self.assertRaises(TypeError, getargs_n, 3.14) | |||
self.assertEqual(99, getargs_n(Index())) | |||
self.assertEqual(0, getargs_n(IndexIntSubclass())) | |||
self.assertEqual(getargs_n(IndexIntSubclass()), 99) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nitpick: inconsistent arg ordering. Will fix.
@@ -66,10 +66,10 @@ def __index__(self): | |||
direct_index = my_int.__index__() | |||
operator_index = operator.index(my_int) | |||
self.assertEqual(direct_index, 8) | |||
self.assertEqual(operator_index, 7) | |||
self.assertEqual(operator_index, 8) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is the key change: for a subclass of int
, we take the __index__
result to be the true value instead of the integer's value.
Py_INCREF(item); | ||
return item; | ||
} | ||
|
||
/* In general, use __index__ */ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nitpick: redundant comment. I'll remove it.
The test failure appears to be due to |
Some of these warnings were added in 3.8. We cannot turn them into TypeError in the same version. |
Could you please try rebasing on master to see if it helps. One of the assertion errors in test_asyncio was fixed with #13754 . |
Are you sure? Which ones? The PR removes 3 |
The warning added in bpo-36048. |
Ah yes, right. Good point. Closing. |
This PR:
DeprecationWarning
s introduced by @serhiy-storchaka in Python 3.4 for non-integer return values from__int__
and__index__
intoTypeError
soperator.index
andPyNumber_Index
always give the same return value as__index__
. This fixes the inconsistency reported by @warsaw in bpo-17576.Still working on doc updates and what's-new entries, but making the PR now so that others can review.
https://bugs.python.org/issue17576